package com.aiwiown.snackmq.api.config;

import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
public class ConsumerConfig {
    /**
     * 【新增】用户名，用于认证
     */
    private String username;

    /**
     * 【新增】密码，用于认证
     */
    private String password;

    /**
     * 消费组名称
     */
    private String consumerGroup;

    /**
     * 【优化】用于执行消费业务逻辑的线程池大小。
     * 默认值为 4。这允许最多 4 条消息被并发处理。
     * 如果设置为 0，则消费逻辑将在拉取线程中同步执行，这会保证严格的顺序性，但会牺牲吞吐量。
     */
    @Builder.Default
    private int consumeThreadNums = 4;

    /**
     * 【优化-新增】消费失败时的最大重试次数。
     * 超过此次数后，消息将被发送到死信队列。
     */
    @Builder.Default
    private int maxRetryTimes = 3;

    /**
     * 【优化-新增】处理重定向时的最大重试次数。
     */
    @Builder.Default
    private int maxRedirectRetries = 3;

    /**
     * 【优化-新增】拉取消息任务的初始延迟时间（毫秒）。
     */
    @Builder.Default
    private long pullInitialDelayMillis = 100;

    /**
     * 【优化-新增】拉取消息任务的固定间隔时间（毫秒）。
     */
    @Builder.Default
    private long pullIntervalMillis = 500;

    /**
     * 【修复-新增】顺序消费失败时的重试间隔（毫秒）。
     * 当 OrderedMessageListener 返回 RETRY 时，客户端将等待此时间后再进行重试。
     */
    @Builder.Default
    private long orderedRetryDelayMillis = 1000;

    /**
     * 【新增】消费速率限制（每秒处理的消息数）。
     * 默认 0 表示不限流。
     */
    @Builder.Default
    private double rateLimitPerSecond = 0;
    /**
     * 【新增-性能调优】客户端为每个分区缓冲的最大消息数。
     * 这是一个关键的流控参数。当某个分区的缓冲区满了之后，消费者会暂停从该分区拉取新消息，
     * 直到业务逻辑消费掉部分缓冲区的消息为止。这可以有效防止因消费速度跟不上拉取速度而导致的内存溢出。
     */
    @Builder.Default
    private int pullMessageBufferCapacity = 1000;

    /**
     * 批量消费时，一次从内部缓冲区获取的最大消息数量。
     * <p>
     * 此设置仅对 {@link com.aiwiown.snackmq.api.BatchMessageListener} 生效。
     * consumeBatchSize (消费批次): 控制业务监听器一次从本地内存缓冲区消费多少条消息。它主要影响业务处理的粒度。
     * </p>
     * 默认为 32。
     */
    @Builder.Default
    private int consumeBatchSize = 32;
    /**
     * 【新增】Push模式下，每次从Broker拉取的最大消息数量。
     * 较大的值可以减少网络往返次数，提高吞吐量，但会增加单次请求的内存消耗。
     * pullBatchSize (拉取批次): 控制客户端一次从 Broker 拉取多少条消息到本地内存缓冲区。它主要影响网络效率
     */
    @Builder.Default
    private int pullBatchSize = 128;

    /**
     * 【新增】【编译修复】当一次拉取返回为空时，延迟多少毫秒再进行下一次拉取。
     * 这可以防止在没有消息时进行过于频繁的空轮询，从而降低CPU和网络负载。
     * 默认值为 50 毫秒。
     */
    @Builder.Default
    private long pullDelayOnEmptyMillis = 50L;

    /**
     * 【新增】非顺序消息消费失败后的重试延迟时间（毫秒）。
     * 默认值为 5000ms (5秒)。
     */
    @Builder.Default
    private long retryDelayMillis = 5000L;
}